package pers.mobian.springsixth.connection;

import org.springframework.beans.factory.support.AbstractBeanDefinition;
import org.springframework.beans.factory.support.BeanDefinitionBuilder;
import org.springframework.beans.factory.support.BeanDefinitionRegistry;
import org.springframework.context.annotation.ImportBeanDefinitionRegistrar;
import org.springframework.core.type.AnnotationMetadata;
import pers.mobian.springsixth.mapper.StudentMapper;
import pers.mobian.springsixth.mapper.TeacherMapper;

import java.util.ArrayList;
import java.util.Map;

/**
 * @Date 2021/7/17 16:49
 * @Created mobian
 * @Description 用于生成mapper的代理对象
 */
public class ProxyMapperBDRegistrar implements ImportBeanDefinitionRegistrar {


	@Override
	public void registerBeanDefinitions(AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {

		// 获取注解上的值
		// 该类被Import注解所引用，且Import注解使用在@MobianMapperScan注解上，即@MobianMapperScan注解就能够获取对应的路径值
		Map<String, Object> annotationAttributes = importingClassMetadata.getAnnotationAttributes(MobianMapperScan.class.getName());

		// 有了对应的路径，就能够利用spring去扫描对应路径下的class，继而将class存放到对应的集合中，再完成接下来的动作
		System.out.println(annotationAttributes.get("value"));

		// 模拟后期扫描到的class文件，并且将class文件存放到对应的集合中的场景
		ArrayList<Class> mappers = new ArrayList<>();
		mappers.add(TeacherMapper.class);
		mappers.add(StudentMapper.class);


		for (Class mapper : mappers) {

			// 创建一个默认的bd，并设置对应的bd的类型，
			AbstractBeanDefinition beanDefinition = BeanDefinitionBuilder.genericBeanDefinition().getBeanDefinition();
			beanDefinition.setBeanClass(MobianFactoryBean.class);

			// 使用对应的构造方法，完成属性的初始化。
			// 此处的属性为，我们扫描到的每一个mapper文件
			beanDefinition.getConstructorArgumentValues().addGenericArgumentValue(mapper);

			// 将我们的bd注入到spring的容器中
			registry.registerBeanDefinition(mapper.getName(), beanDefinition);
		}

	}
}
